package com.ftg.learn.back;

import com.ftg.learn.back.exception.MyException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author kangjx
 * @createTime 2022/8/29
 */
public class NoteMap4 {

    private List<Map<String,Object>> notes = new ArrayList<>();

    /**
     * 根据用户名以电话 号码进行添加操作
     * @param name     姓名
     * @param telphone  电话 s
     * @return
     */
    public boolean add(String name,String telphone){
        Map<String,Object> map = new HashMap<>(2);
        map.put("name",name);
        map.put("telphone",telphone);
        notes.add(map);
        return true;
    }

    /**
     * 返回 信息统一问题
     * 根据用户传递过来的map进行添加操作
     * @param humaninfo  用户信息  要求包含 keys : [name,telphone]
     * @return true
     */
    public boolean add(Map<String,Object> humaninfo){
//        Map<String,Object> map = new HashMap<>(2);
//        if(humaninfo.containsKey("name")){
//            map.put("name",humaninfo.get("name"));
//        }
//
//        if(humaninfo.containsKey("telphone")){
//            map.put("telphone",humaninfo.get("telphone"));
//        }
//        notes.add(map);
        Map<String,Object> map = new HashMap<>(2);
        if(!humaninfo.containsKey("name")){
            throw new MyException("对不起，请添加通讯录姓名!!!");
        }

        if(!humaninfo.containsKey("telphone")){
            throw new MyException("对不起，请添加电话号码!!!");
        }

        map.put("name",humaninfo.get("name"));
        map.put("telphone",humaninfo.get("telphone"));
        notes.add(map);
        return true;
    }

    /**
     * 根据用户名来修改对应的电话号码
     *  1： 如果说姓名存在 直接修改还是合并添加
     *  2 ： 如果姓名不存在，是抛出异常，还是直接添加
     * @param name
     * @param telphone
     * @return
     */
    public boolean updateEXIST_UPDATE(String name,String telphone){
        this.update(name,telphone,StatusEunm.EXIST_UPDATE);
        return true;
    }

    public boolean updateEXIST_MERGE(String name,String telphone){
        this.update(name,telphone,StatusEunm.EXIST_MERGE);
        return true;
    }

    public boolean updateNOTEXIST_ADD(String name,String telphone){
        this.update(name,telphone,StatusEunm.NOTEXIST_ADD);
        return true;
    }
    public boolean updateNOTNOTEXIST_EXCEPTION(String name,String telphone){
        this.update(name,telphone,StatusEunm.NOTEXIST_EXCEPTION);
        return true;
    }

    public boolean updateByStatus(String name,String telphone,StatusEunm status){
        this.update(name,telphone,status);
        return true;
    }

    public boolean delByName(String name){
        return this.del(name,StatusEunm.DEL_NAME);
    }


    public boolean delByTel(String tel){
        return this.del(tel,StatusEunm.DEL_TEL);
    }

    public boolean del(String name){
        return this.del(name,null);
    }

    /**
     * 按照要求进行删除 操作
     * @param val
     * @param status
     * @return
     */
    private boolean del(String val,StatusEunm status){
        int index = -1;
        if(status == StatusEunm.DEL_NAME){
            index = this.isExist(val);
            if(index == -1){
                throw new MyException(Tip.NON_NAME_EXIST.toString());
            }
        }else if(status == StatusEunm.DEL_TEL){
            index = this.isExistByTel(val);
            if(index == -1){
                throw new MyException(Tip.NON_TEL_EXIST.toString());
            }
        }else{
            this.del(val,StatusEunm.DEL_NAME);
        }
        this.notes.remove(index);
        return true;
    }



    /**
     * 修改的核心方法
     * @param name     姓名
     * @param telphone 电话
     * @param status   处理状态
     * @return
     */
    private boolean update(String name,String telphone,StatusEunm status){
        //多个方法 全用到
        int index = this.isExist(name);
        if(status == StatusEunm.EXIST_UPDATE && index > 0 ){
            this.notes.set(index,this.createNotes(name,telphone));

        }else if(status == StatusEunm.EXIST_MERGE && index > 0){
            Map<String,Object> oldNotes = this.notes.get(index);
            String newTelphone = oldNotes.get("telphone") + "," + telphone;
            oldNotes.put("telphone",newTelphone);

        }else if(status == StatusEunm.NOTEXIST_ADD && index == -1){
           this.add(name,telphone);

        }else if(status == StatusEunm.NOTEXIST_EXCEPTION){
            throw new MyException(Tip.NON_NAME_EXIST.toString());

        }
        return true;
    }

    /**
     * 构造用来生成map信息的方法
     * @param name     用户 名
     * @param telphone 电话
     * @return
     */
    private Map<String,Object> createNotes(String name,String telphone){
        Map<String,Object> temp = new HashMap<>(2);
        temp.put("name",name);
        temp.put("telphone",telphone);
        return temp;
    }

    /**
     * 判断当前用户 名是否存在
     * @param name  用户 名
     * @return
     */
    private int isExist(String name){
        for (int i = 0; i < this.notes.size(); i++) {
            if(this.notes.get(i).get("name").equals(name)){
                return i;
            }
        }
        return -1;
    }

    private int isExistByTel(String tel){
        for (int i = 0; i < this.notes.size(); i++) {
            if(this.notes.get(i).get("telphone").equals(tel)){
                return i;
            }
        }
        return -1;
    }

    /**
     * 去掉重复项
     * @return
     */
    public List<Map<String,Object>> distinct(){
        return this.notes.stream().distinct().collect(Collectors.toList());
    }

}
